package main

import "fmt"

type Employee struct {
	firstName string
	lastName  string
}

// 结构体Employee的方法fullname()
func (emp Employee) fullname() {
	fmt.Println("Employee", emp.firstName, emp.lastName)
}

// 结构体Employee的方法changeName()
func (emp *Employee) changeName(newFirstName string) {
	emp.firstName = newFirstName
}

// 定义一个带有返回值的函数
func fun() int {
	return 1
}

// 定义一个带有参数的函数
func fun2(a int, b int) int {
	return a + b
}

// 定义一个带有多个返回值的函数
func fun3() (int, int) {
	return 1, 2
}

func addAll(args ...int) (int, int) {
	finalAddValue := 0
	finalSubValue := 0
	for _, v := range args {
		finalAddValue += v
		finalSubValue -= v
	}
	return finalAddValue, finalSubValue
}

// 定义一个闭包函数
func adder() func(int) int {
	sum := 0
	return func(x int) int {
		sum += x
		return sum
	}
}

// 定义一个匿名函数
var fun4 = func() {
	fmt.Println("这是一个匿名函数")
}

func main() {
	emp1 := Employee{"John", "Doe"}
	emp1.fullname()

	emp1.changeName("Smith")
	emp1.fullname()

	// 调用fun()函数
	result := fun()
	fmt.Println("fun 函数 Result:", result)

	// 调用fun2()函数
	result2 := fun2(1, 2)
	fmt.Println("fun2 函数 Result:", result2)

	// 调用fun3()函数
	result3, result4 := fun3()
	fmt.Println("fun3 函数 Result:", result3, result4)

	// 调用addAll()函数
	result5, result6 := addAll(1, 2, 3, 4, 5)
	fmt.Println("addAll 函数 Result:", result5, result6)

	// 调用adder()函数
	sum := adder()
	fmt.Println("带参数调用函数adder第一次", sum(10)) // 10
	fmt.Println("带参数调用函数adder第二次", sum(20)) // 30
	fmt.Println("带参数调用函数adder第三次", sum(30)) // 60

	// 调用fun4()函数
	fun4()

	// 数组
	var x [5]int
	var i, j int
	for i = 0; i < 5; i++ {
		x[i] = i + 10
	}
	fmt.Println(x)

	for j = 0; j < 5; j++ {
		fmt.Printf("元素[%d] = %d\n", j, x[j])
	}

	// 多维数组
	var a = [5][2]int{
		{0, 0},
		{1, 2},
		{2, 4},
		{3, 6},
		{4, 8},
	}
	fmt.Println("多维数组：")
	fmt.Println(a[3][1])
	fmt.Println(a)

	// 切片
	fmt.Println("切片：")
	odd := []int{1, 3, 5}
	var numbers = make([]int, 3, 5)
	fmt.Println("切片odd")
	fmt.Println(odd)

	numbers[0] = 1
	numbers[1] = 2
	numbers[2] = 3
	fmt.Println("切片numbers")
	fmt.Println(numbers)

	//切片增删改查
	numbers = append(numbers, 2)
	fmt.Println("切片增")
	fmt.Println(numbers)
	// 删除切片中的元素
	fmt.Println("切片删")
	numbers = append(numbers[:1], numbers[2:]...)
	fmt.Println(numbers)
	// 修改切片中的元素
	numbers[0] = 10
	fmt.Println("切片改")
	fmt.Println(numbers)
	// 查找切片中的元素
	for i, v := range numbers {
		fmt.Println(i, v)
	}

	// 切片的长度和容量
	fmt.Println("切片的长度和容量")
	fmt.Println(len(numbers))
	fmt.Println(cap(numbers))
	fmt.Println(numbers)
}
